# 加载必要的R包
library(ggplot2)    # 用于数据可视化
library(dplyr)      # 用于数据操作和转换
library(scales)     # 用于坐标轴标签格式化

# Data Preparation and Visualization of Patient Biomarker Levels by Subtype -----
# 清理工作环境并设置随机种子
rm(list = ls())     # 清除所有变量
set.seed(123)       # 设置随机种子以保证结果可重现

# 定义基本参数
n_patients <- 30    # 患者数量
biomarker_subtypes <- c("Subtype_A", "Subtype_B", "Subtype_C", "Subtype_D")  # 生物标志物亚型
patients <- sprintf("%02d", 1:n_patients)  # 生成格式化的患者ID（01-30）

# 定义亚型颜色（红、蓝、绿、橙）
subtype_colors <- c("#E74C3C", "#3498DB", "#2ECC71", "#F39C12")

# 创建患者数据框
df_patients <- data.frame(
  patient_id = patients,              # 患者ID
  biomarker_subtype = sample(         # 随机分配生物标志物亚型
    biomarker_subtypes,
    size = n_patients,
    replace = TRUE,                   # 允许重复
    prob = c(0.25, 0.25, 0.25, 0.25)  # 每个亚型的概率相等
  )
) %>%
  # 为每个亚型生成不同的生物标志物水平
  mutate(
    biomarker_level = case_when(
      biomarker_subtype == "Subtype_A" ~
        rnorm(n(), mean = 20, sd = 2) %>% round(1),    # 亚型A：均值20，标准差2
      biomarker_subtype == "Subtype_B" ~
        rnorm(n(), mean = 35, sd = 3.5) %>% round(1),  # 亚型B：均值35，标准差3.5
      biomarker_subtype == "Subtype_C" ~
        rnorm(n(), mean = 28, sd = 2.8) %>% round(1),  # 亚型C：均值28，标准差2.8
      biomarker_subtype == "Subtype_D" ~
        rnorm(n(), mean = 42, sd = 4.2) %>% round(1)   # 亚型D：均值42，标准差4.2
    )
  ) %>%
  # 按亚型和患者ID排序
  arrange(biomarker_subtype, patient_id) %>%
  # 创建排序后的患者ID因子变量
  mutate(sorted_patient_id = factor(patient_id, levels = patient_id)) %>%
  # 确保患者ID唯一性
  distinct(sorted_patient_id, .keep_all = TRUE)


# 创建患者生物标志物水平集中图
p_patient_concentrated <- ggplot(df_patients, aes(x = sorted_patient_id)) +
  geom_col(  # 添加柱状图（显示生物标志物水平）
    aes(y = biomarker_level, fill = biomarker_subtype),  # 填充颜色按亚型区分
    width = 0.6,         # 柱状图宽度
    color = "white",     # 边框颜色
    linewidth = 0.2,     # 边框线宽
    alpha = 0.9          # 透明度
  ) +
  geom_line(  # 添加折线图（连接相同亚型的点）
    aes(
      y = biomarker_level,
      color = biomarker_subtype,  # 线条颜色按亚型区分
      group = biomarker_subtype   # 按亚型分组
    ),
    linewidth = 1.2,    # 线条宽度
    alpha = 0.9         # 透明度
  ) +
  geom_point(  # 添加数据点
    aes(y = biomarker_level, color = biomarker_subtype),  # 点颜色按亚型区分
    shape = 21,           # 空心圆点形状
    fill = "white",       # 内部填充白色
    size = 3,             # 点大小
    stroke = 1            # 边框宽度
  ) +
  geom_text(  # 添加数值标签
    aes(y = biomarker_level, label = biomarker_level),  # 显示生物标志物水平值
    vjust = -1,           # 垂直位置调整（向上偏移）
    size = 3,             # 字体大小
    color = "#34495E",  # 字体颜色（深蓝色）
    fontface = "bold"     # 粗体
  ) +
  scale_x_discrete(     # X轴设置
    expand = expansion(add = 0.3),                      # 扩展X轴范围
    name = "Patients (ID: 01-30, grouped by Subtype)"   # X轴标题
  ) +
  scale_y_continuous(   # Y轴设置
    expand = expansion(mult = c(0, 0.2)),                   # 扩展Y轴范围（仅上方）
    limits = c(0, max(df_patients$biomarker_level) * 1.3),  # Y轴范围（0到最大值的1.3倍）
    breaks = scales::pretty_breaks(n = 7),                  # 自动生成7个刻度点
    labels = scales::number_format(accuracy = 1)            # 数值格式（整数）
  ) +
  labs(  # 图表标签设置
    y = "Comprehensive Biomarker Level \n Treatment Response",  # Y轴标题（两行）
    fill = "Biomarker Subtype",   # 填充图例标题
    color = "Biomarker Subtype"   # 颜色图例标题
  ) +
  guides(  # 图例设置
    fill = guide_legend(        # 填充图例设置
      keywidth = 1.2,           # 图例键宽度
      keyheight = 0.8,          # 图例键高度
      nrow = 1,                 # 图例行数
      title.position = "top",   # 标题位置
      title.hjust = 0.5,        # 标题水平对齐
      override.aes = list(linewidth = 1.2, color = subtype_colors)  # 覆盖图例样式
    ),
    color = "none"              # 隐藏颜色图例（避免重复）
  ) +
  theme_classic(base_size = 10.5) +   # 使用经典主题并设置基础字体大小
  theme(
    legend.position = "top",          # 图例位置（顶部）
    legend.justification = "center",  # 图例对齐方式
    legend.box = "horizontal",        # 图例框方向
    legend.margin = margin(b = 8),    # 图例边距（底部8单位）
    legend.title = element_text(face = "bold", color = "#34495E", size = 9.5),  # 图例标题样式
    legend.text = element_text(color = "#7F8C8D", size = 8.5),                  # 图例文本样式
    axis.title.x = element_text(      # X轴标题样式
      face = "bold",
      color = "#34495E",
      margin = margin(t = 12),        # 上边距12单位
      size = 9.5
    ),
    axis.title.y = element_text(      # Y轴标题样式
      face = "bold",
      color = "#34495E",
      margin = margin(r = 10),        # 右边距10单位
      size = 9.5
    ),
    axis.text.x = element_text(       # X轴刻度文本样式
      color = "#7F8C8D",
      angle = 60,                     # 文本旋转60度
      hjust = 1,                      # 水平对齐方式
      size = 8
    ),
    axis.text.y = element_text(color = "#7F8C8D", size = 8),  # Y轴刻度文本样式
    panel.grid = element_blank(),                # 移除网格线
    #plot.margin = margin(10, 15, 10, 15)        # 图表边距（注释状态）
  ) +
  scale_fill_manual(values = subtype_colors) +   # 手动设置填充颜色
  scale_color_manual(values = subtype_colors)    # 手动设置线条和点颜色


# 显示图表
p_patient_concentrated
